﻿#define _CRT_SECURE_NO_WARNINGS

//void func() 
//{
//	//当满足某个条件时抛出异常
//	if () 
//	{
//		throw e;
//	}
//}
//
//try 
//{
//	// 保护的标识代码
//	func();
//}
//
//
//catch (ExceptionName e1) 
//{
//	// catch 块
//}
//catch (ExceptionName e2) 
//{
//	// catch 块
//}
//catch (ExceptionName eN) 
//{
//	// catch 块
//}

//void func1()
//{
//	throw string("这是一个异常");
//}
//
//void func2()
//{
//	func1();
//}
//
//void func3()
//{
//	func2();
//}
//
//int main()
//{
//	try
//	{
//		func3();
//	}
//	catch (const string& s)
//	{
//		cout << "错误描述：" << s << endl;
//	}
//	catch (...)
//	{
//		cout << "未知异常" << endl;
//	}
//	return 0;
//}


double Divide(int a, int b)
{
	// 当b == 0时抛出异常 
	if (b == 0)
	{
		throw "Division by zero condition!";
	}
	return (double)a / (double)b;
}

void Func()
{
	// 这里可以看到如果发⽣除0错误抛出异常，另外下⾯的array没有得到释放。 
	// 所以这里捕获异常后并不处理异常，异常还是交给外层处理，这里捕获了再 
	// 重新抛出去。 
	int* array = new int[10];

	try
	{
		int len, time;
		cin >> len >> time;
		cout << Divide(len, time) << endl;
	}

	catch (...)
	{
		// 捕获异常释放内存 
		cout << "delete []" << array << endl;
		delete[] array;
		throw; // 异常重新抛出，捕获到什么抛出什么 
	}
	cout << "delete []" << array << endl;
	delete[] array;
}

int main()
{
	try

	{
		Func();
	}

	catch (const char* errmsg)
	{
		cout << errmsg << endl;
	}

	catch (const exception& e)
	{
		cout << e.what() << endl;
	}

	catch (...)
	{
		cout << "Unkown Exception" << endl;
	}
	return 0;
}

